package main

import "fmt"

/*
流程控制之for循环

TIPS：

	· for是Go语言中唯一的循环语句，Go没有 while、do...while 循环；
	· for循环中for关键字后不能加小括号
*/
func main() {

	/*
		一. 语法结构之： for 初始语句; 条件表达式; 结束语句

		TIPS：
			1. 先执行初始语句，对控制变量赋初始值。初始语句只执行一次；
			2. 条件表达式可以省略不写，之后的分号必须要写。省略条件表达式默认形成无限循环
	*/
	for i := 0; i < 10; i++ {
		fmt.Println("for 初始语句; 条件表达式; 结束语句", i)
	}
	for i := 20; ; i++ {
		if i > 25 {
			// break语句结束当前的循环并无条件跳出循环体，然后执行循环体后的语句
			break
		}
		if i%2 != 0 {
			// continue语句跳过当前循环，而开始执行下一次循环
			continue
		}
		fmt.Println("条件表达式省略", i)
	}

	/*
		二. 语法结构之： for 循环条件

		TIPS：效果类似其他编程语言中的while循环
	*/
	// 默认值为0，从0开始
	var i int
	for i < 10 {
		fmt.Println("for 循环条件", i)
		i++
	}

	/*
		三. 语法结构之：for关键字后无表达式

		TIPS：效果与其他编程语言的for(;;) {}一致，此时for执行无限循环
	*/
	var y int
	for {
		if y > 10 {
			break
		}
		fmt.Println("for关键字后无表达式", y)
		y++
	}

	/*
		四. 语法结构之：for 键, 值 := range 原始值。对于不同类型，具备不同意义：
		- 对string、slice、array、map、channel等进行迭代循环；
		- array、slice、string返回索引和值；
		- map返回键和值；
		- channel只返回通道内的值；
	*/
	str := "我是steven qin"
	for i, value := range str {
		fmt.Printf("第 %d 位的ASCII 值 = %d，字符位 = %c \n", i, value, value)
	}
}
